perm filename PASSER.BAK[V,VDS] blob sn#372084 filedate 1978-08-03 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE PASSER
C00005 00003	SCAN FOR START OF DATA BLOCK AND THEN FILL TTY BUFFER
C00008 00004	OUTPUT THE TTY BUFFER
C00009 00005	PROCEDURES:  GETNME,GET6BT
C00011 00006	PROCEDURES:  GETCHR,PACK
C00013 00007	LOCAL STORAGE AREA
C00014 ENDMK
C⊗;
TITLE PASSER


;PASSER CAN BE USED TO TRANSFER DISK FILES IN PDP11 BINARY
;FORMAT OVER A TTY PHONE LINE.  THE BINARY 16 BIT WORDS
;ARE SENT 6 BITS AT A TIME, THREE BYTES TO A WORD.

;DEFINITIONS

P←17		;PUSH STACK POINTER
FILE←1		;DISK FILE CHANNEL
COUNT←4		;NUMBER OF BYTES LEFT IN BLOCK
OLDB←5		;OLD TTY BUFFER
NEWB←6		;NEW TTY BUFFER
TTYB←7		;TTY BUFFER BYTE POINTER
DPBP←10		;DPB POINTER
DMES←11		;DONE MESSAGE



;INITIALIZE PROGRAM AND INPUT DISK FILE

PASSER:	RESET
	MOVE	P,[XWD -50,PDL-1]	;INITIALIZE PUSH STACK
	OUTSTR	[ASCIZ /
BINARY FILE PASSER PROGRAM
/]
	INIT	FILE,10		;INITIALIZE DISK CHANNEL
	SIXBIT	/DSK/
	IBUF
	HALT	.
	INBUF	FILE,4		;SET UP BUFFER RING

ASKNME:	OUTSTR	[ASCIZ /FILE NAME = /]
	PUSHJ	P,GETNME	;DECODE NAME TO SIXBIT
	SETZM	INAME+3		;USE THIS JOB'S PPN
	LOOKUP	FILE,INAME	;OPEN FILE FOR READING
	JRST	[  	OUTSTR [ASCIZ /***LOOK UP FAILED, TRY AGAIN**
/]
		   	JRST ASKNME ]
	
;CHANGE TTY CHARACTERISTICS

	CLRBFI
	OUTSTR	[ASCIZ /TYPE (CNTRL)G TO START TRANSFER: /]
	SETOM	TTYBIT		;SAVE AND CHANGE TTY BITS TO
	GETLIN	TTYBIT		;  PASS EACH CHARACTER AS IS
	MOVE	TTYBIT
	TLZ	110010		;NO ARROW,NO FILL,TAB
	TLO	26		;FULL, NO ECHO
	SETLIN
	MOVE	[-1,,[026000,,1]]  ;DONT CONVERT TO STANDARD ASCII
	TTYSET
;SCAN FOR START OF DATA BLOCK AND THEN FILL TTY BUFFER

	MOVEI	NEWB,OBUF1	;SET UP TTY BUFFER PTRS
	MOVEI	OLDB,OBUF2
	MOVE	DPBP,[POINT 8,1,27] ;BYTE PTR TO FORM 16 BIT WORD 
	MOVEI	DMES,[ASCIZ /
[FATAL] CATCHER TERMINATED TRANSFER BEFORE END OF FILE 
/]

SCAN:	PUSHJ	P,GETCHR	;0 ← NEXT BYTE
	JRST	[	MOVEI DMES,[ASCIZ /
FILE TRANSFER COMPLETED/]
			INCHRW
			JRST ALLDNE ]; EOF
	CAIE	1		;1 = START OF BLOCK
	JRST	SCAN
	MOVE	1,0

	EXCH	NEWB,OLDB	;START FILLING NEW TTY BUFFER
	MOVE	TTYB,[POINT 7,0];FORM BYTE PTR
	HRRI	TTYB,(NEWB)

	PUSHJ	P,GETCHR	;ZERO SHOULD FOLLOW THE 1
	JRST	[DSKERR: OUTSTR [ASCIZ /
[FATAL ERROR] UNEXPECTED EOF/]
			 JRST   PASSDN]
	TRNE	0
	JRST	[	OUTSTR [ASCIZ /
[WARNING] ILLEGAL BLOCK FORMAT ENCOUNTERED/]
		 	JRST 	.+1]
	PUSHJ	P,PACK

	PUSHJ	P,GETCHR	;GET BLOCK LENGTH
	JRST	DSKERR
	MOVE 	1,0
	PUSHJ	P,GETCHR
	JRST	DSKERR
	DPB	DPBP		;PUT THE 16 BIT WORD TOGETHER
	MOVEI	COUNT,(1)	;NUMBER OF CHARACTERS LEFT IN BLOCK
	CAIN	COUNT,6		;END OF EXECUTABLE CODE?
	JRST	[	MOVEI DMES,[ASCIZ /
TRANSFER OF PROGRAM WITHOUT SYMBOLS COMPLETED
/]
			JRST .+1]
	SUBI	COUNT,3
	PUSHJ	P,PACK2		;PACK COUNT

PACKBK:	PUSHJ	P,GETCHR	;PACK THAT BLOCK AWAY
	JRST	DSKERR
	MOVE	1,0
	SOJLE	COUNT,[	SETZ		;ENDED ON ODD BYTE
			JRST ODDBTY ]
	PUSHJ	P,GETCHR
	JRST	DSKERR
ODDBTY:	PUSHJ	P,PACK
	SOJG	COUNT,PACKBK
	SETZ			;TERMINATE TTY OUTPUT STRING
	IDPB	TTYB
;OUTPUT THE TTY BUFFER
	
ASKCMD:	INCHRW			;WHAT DO WE DO NOW?
	CAIN	"G"		;G → TYPE NEW TTY BUFFER
	JRST	[	OUTSTR (NEWB)
			JRST SCAN    ]
ALLDNE:	CAIN	"C"		;C → CHECK SUM ERROR, TYPE OLD BUFFER AGAIN
	JRST	[  	OUTSTR (OLDB)
		   	JRST ASKCMD  ]
	CAIN	"D"		;D → END OF TRANSFER
	JRST	[	OUTSTR (DMES)
			JRST PASSDN  ]
	CAIE	"F"		;F → FATAL ERROR, TERMINATE
	JRST	[  	OUTSTR  [ASCIZ /
[FATAL ERROR] UNEXPECTED RESPONSE FROM TTY/]
			JRST .+1     ]


;EXIT CLEANLY


PASSDN:	RELEAS 	FILE,		;CLOSE DISK FILE
	SETLIN	TTYBIT		;RESET TTY BITS TO AS BEFORE
	EXIT
;PROCEDURES:  GETNME,GET6BT

GETNME:	MOVE	1,[POINT 6,INAME]  ;PACK 6 BIT NAME
	SETZM	INAME
SPACES:	PUSHJ	P,GET6BT	;IGNOR LEADING SPACES
	JRST	SAVCHR
	JUMPE	SPACES
	JRST	GETNDN

SAVCHR:	IDPB	1		;SAVE A CHARACTER OF THE NAME
	PUSHJ	P,GET6BT	;NEXT SIXBIT CHAR
	JRST	SAVCHR		;LEGAL CHAR
	SETZM	INAME+1		;PACK EXTENSION IN HERE
	MOVE	1,[POINT 6,INAME+1]
	CAIN	16		;"." SEPARATES NAME AND EXT
	JRST	CHKEXT
	JRST	GETNDN

SAVEXT:	IDPB	1		;SAVE EXTENSION CHAR
CHKEXT:	PUSHJ	P,GET6BT
	JRST	SAVEXT

GETNDN:	CLRBFI
	POPJ	P,


GET6BT:	INCHWL			;GET A CHARACTER
	TRZ	40		;CONVERT ASCII TO SIXBIT
	TRZE	100
	TRO	40
	CAIGE	20		;SKIP RETURN IF NOT 0 TO Z
	AOS	(P)
	CAILE	72
	AOS	(P)
	POPJ	P,		;RETURN
;PROCEDURES:  GETCHR,PACK

GETCHR:	SOSG	IBUF+2		;NEED A NEW BUFFER?
	IN	FILE,		;YES, TRY READING SOME MORE
	JRST	CANGET
	STATZ	FILE,20000	;IN FAILED, EOF?
	POPJ	P,		;YES
	OUTSTR	[ASCIZ /
[FATAL] DISK INPUT ERROR/]
	POPJ	P,

CANGET:	ILDB	IBUF+1		;GET A WORD
	AOS	(P)		;TAKE SUCCESS RETURN
	POPJ	P,



PACK:	DPB	DPBP		;PUT THE 16 BIT WORD TOGETHER
PACK2:	MOVEI	(1)  		;PACK 6 LSB+1
	TRZ	777700
	AOJ	
	CAIL	11		;LF'S → CR MAP TO 133 TO 137
	JRST	[	CAIG 15
			ADDI 162
			JRST .+1 ]
	IDPB	TTYB
	ASH	1,-6		;PACK NEXT 6 LSB+1
	MOVEI	(1)
	TRZ	777700
	AOJ	
	CAIL	11		;LF'S → CR MAP TO 133 TO 137
	JRST	[	CAIG 15
			ADDI 162
			JRST .+1 ]
	IDPB	TTYB
	ASH	1,-6		;PACK FINAL 4 BITS
	AOJ	1,
	CAIL	1,11		;LF'S → CR MAP TO 133 TO 137
	JRST	[	CAIG 1,15
			ADDI 1,162
			JRST .+1 ]
	IDPB	1,TTYB
	POPJ	P,
;LOCAL STORAGE AREA

IBUF:	BLOCK	3	;INPUT BUFFER POINTER

TTYBIT:	0		;INITIAL TTY STATUS BITS

INAME:	BLOCK	4	;FILE NAME,EXTENSION,0,PPN

OBUF1:	BLOCK	=2000	;TTY OUTPUT BUFFERS
OBUF2:	BLOCK	=2000

PDL:	BLOCK 	50	;PUSH STACK

END PASSER